Criação de imagens sintéticas

Imagens sintéticas são bastante utilizadas nos testes de algoritmos e na geração de padrões de imagens.

Iremos aprender a gerar os valores dos pixels de uma imagem a partir de uma equação matemática de forma muito eficiente, sem a necessidade de se usar explicitamente a varredura dos pixels através do comando for.

A forma preferencial de criação de imagens sintéticas, quando sua equação é fornecida, é através do uso das funções que geram uma matriz de coordenadas. As duas funções que iremos utilizar neste curso são indices e meshgrid.

Estude o tutorial em:

Ele é fundamental para entender os exemplos a seguir.


In [14]:
import numpy as np

Imagem da função "sela"

A função "sela" bidimensional é uma função dada pelo produto de suas coordenadas r e c. Observe que, implementando desta forma, é possível fazer com que o código Python/NumPy fique muito próximo à equação matemática, colocada a seguir.

Vamos gerar uma função sela, onde os valores para as linhas serão valores inteiros entre -75 e 75 e os valores para as colunas, inteiros no intervalo [-100,100]:

$$ f(r,c) = r \ c $$$$ \text{para} \ r \in [-75,75] $$$$ c \in [-100,100]$$

No exemplo a seguir é utilizado a função arange para gerar os vetores de coordenadas. Para melhorar a visualização foi utilizada a função ia636:iaisolines iaisolines que permite visualizar os pixels de mesmo valores (isolinhas) da imagem gerada com uma cor destacada.


In [15]:
r,c = np.meshgrid(np.arange(-75,75), np.arange(-100,100), indexing='ij')
f = r * c

In [20]:
%matplotlib inline
import matplotlib.pyplot as plt
plt.title('Ponto de sela')
plt.imshow(f, cmap='gray')


Out[20]:
<matplotlib.image.AxesImage at 0x10eae1668>

Outras images criadas com matrizes de índices

Veja algumas outras funções da toolbox ia636:MainPage que também foram feitas desta forma:

Criação de gaussiana n-dimensional

Uma função também escrita com índices matriciais, porém muito mais complexa de entender é a ia636:iagaussian. Veja que o código é extremamente curto, porém bastante complexo e ela ainda funciona para qualquer dimensão, desde 1-D, 2-D, 3-D, isto é, n-D. Para quem estiver interessado em entender como ela funciona, existe uma demonstração que procura explicar seu funcionamento em